#ifndef _TRANSPORTLAYER_H_
#define _TRANSPORTLAYER_H_
#include "../DataBase.h"
#include "../Thread.h"
#include "../../Util.h"
#include "xxhash.h"
#include <algorithm>
#include <chrono>
#include <iostream>
#include <map>
#include <memory>
#include <string>
#include <sw/redis++/errors.h>
#include <thread>
#include <unordered_map>
#include <utility>
#include <vector>
#include <zlog.h>

/**
 * @Synopsis 完成数据数据分包 ,构造时传入引用 unorder_map ;
 */
class TransportLayer : public DataShare::Thread {
  public:
    /**
     * @Synopsis 传出层模块构造函数
     *
     * @Param inputData 需要上传的数据
     */
    TransportLayer(
        const std::unordered_map<std::string, std::string> &inputData);
    virtual ~TransportLayer();

    /**
     * @Synopsis  控制变量接收接口, 阻塞监听,超时5秒
     *
     * @Param controlData  是applicationlayer下发的控制变量
     *
     * @return 成功返回ErrorInfo::OK , 失败返回错误码
     */
    int OutputData(std::unordered_map<std::string, std::string> &controlData);

    /**
     * @Synopsis  控制变量接收接口, 阻塞监听,超时5秒
     *
     * @Param Callback  控制变量处理回调函数, controlData 是
     * applicationlayer下发的控制参数变量
     *
     * @return 成功返回ErrorInfo::OK , 失败返回错误码
     */
    int OutputData(void (*Callback)(
        std::unordered_map<std::string, std::string> controlData));

    /**
     * @Synopsis 数据上传函数. 创建一个线程，将传入构造函数的数据，进行上传
     */
    void Run() override;

  private:
    /**
     * @Synopsis 输入接口, 将数据传入
     *
     */
    void SyncData();

    /**
     * @Synopsis 初始化
     *
     * @return 成功返回 ErrorInfo::OK
     */
    virtual int Init() override;

  private:
    std::vector<std::unordered_map<std::string, std::string>> hashTab;

    // 将大键值对分组
    void BatchData();

    void TransferData();

    const std::unordered_map<std::string, std::string> &readData;

    std::shared_ptr<DataBase> db;
};
#endif // !_TRANSPORTLAYER_H_
